package x.ovo.wechat.bot.common.entity.message;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import x.ovo.wechat.bot.common.Constant;
import x.ovo.wechat.bot.common.entity.Contact;
import x.ovo.wechat.bot.common.entity.Member;
import x.ovo.wechat.bot.common.enums.MessageType;

import java.io.Serializable;
import java.util.Objects;

/**
 * 封装了原始消息、携带更多数据的消息对象
 *
 * @author ovo, created by 2024/05/01
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Message implements Serializable {


    /** 微信原始消息 */
    protected RawMessage raw;
    /** mssage_id */
    protected Long id;
    /** 文本内容 */
    protected String content;
    /** 消息类型 */
    protected MessageType type;
    /** 来自用户 */
    protected Contact fromUser;
    /** 到用户 */
    protected Contact toUser;

    /** 群消息发送者 */
    protected Member member;

    /**
     * 获取发送人姓名如果有备注则优先显示备注，否则显示昵称
     *
     * @return {@link String}
     */
    public String getFromName() {
        // 如果发送者不存在则返回null
        if (null == this.fromUser) return null;
        // 判断消息是否是群聊消息
        if (this.fromUser.isGroup() && Objects.nonNull(this.member)) {
            // 如果是群聊消息则返回群成员昵称+群昵称
            String suffix = (Objects.isNull(this.member.getDisplayName()) || this.member.getDisplayName().isEmpty()) ? "" : " (" + this.member.getDisplayName() + ")";
            return this.member.getNickName() + suffix;
        }

        // 私聊消息有备注返回备注，无备注返回昵称
        if (null == this.fromUser.getRemarkName() || this.fromUser.getRemarkName().isEmpty())
            return this.fromUser.getNickName();
        return this.fromUser.getRemarkName();
    }

    /**
     * 获取接收人姓名如果有备注则优先显示备注，否则显示昵称
     *
     * @return {@link String}
     */
    public String getToName() {
        // 如果接收者不存在则返回null
        if (null == this.toUser) return null;
        // 判断消息是否来自群聊消息
        if (this.fromUser.isGroup()) {
            // 如果是群聊消息则返回群名称
            return this.fromUser.getNickName();
        }

        // 私聊消息有备注返回备注，无备注返回昵称
        if (null == this.toUser.getRemarkName() || this.toUser.getRemarkName().isEmpty())
            return this.toUser.getNickName();
        return this.toUser.getRemarkName();
    }

    /**
     * 是否是群聊消息
     *
     * @return 返回是否是群组消息
     */
    public boolean isGroup() {
        return this.fromUser.getUserName().contains(Constant.GROUP_IDENTIFY) || this.toUser.getUserName().contains(Constant.GROUP_IDENTIFY);
    }
}
